module.exports = (app) => {
  const { Schema, createModel, getModelName, formatDate, pre } = app.jax.mongoose
  const modelName = getModelName(__filename)

  const schema = new Schema({
    menuName: String, // 菜单名称
    parentId: Schema.Types.ObjectId, // 上级ID
    rank: { type: Number, set: (value) => (value != '' ? Number(value) : null) }, // 序号
    isTop: { type: Boolean, default: false }, // 是否置顶，序号设置后自动置顶
    path: String, // 菜单路径
    isDefault: { type: Boolean, default: false }, // 是否默认菜单
    icon: String, // 图标样式
    iconImage: String, // 图标图片
    query: String, // 菜单参数
    roleId: Schema.Types.ObjectId, // 所属角色ID
    systemType: { type: String, default: 'admin' }, // 所属系统(请看字典)
    type: { type: Number, default: 0 }, // 菜单类型 0、菜单 1、按钮 2、外链
    isHide: { type: Boolean, default: false }, // 是否隐藏
    authKey: String, // 权限标识
    apis: [
      {
        method: String,
        path: String,
      },
    ],
    paths: [String],
  })

  // 修改
  schema.pre(['updateOne', 'findOneAndUpdate', 'updateMany'], function () {
    const data = this.getUpdate()
    pre.getRank(data)
  })

  // 新增
  schema.pre('save', function () {
    pre.getRank(this)
  })

  // 类型描述
  schema.virtual('typeDesc').get(function () {
    return (
      {
        0: '页面',
        1: '按钮',
        2: '外链',
      }[this.type] || '未知'
    )
  })

  const Model = createModel(modelName, schema)

  return Model
}
